package com.ktjy.mapper;

import com.ktjy.pojo.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author LILIBO
 * @description 针对表【sys_user(系统用户)】的数据库操作Mapper
 * @createDate 2025-10-29 17:10:55
 * @Entity com.ktjy.pojo.SysUser
 */
public interface SysUserMapper {

    /**
     * 插入系统用户
     *
     * @param sysUser 系统用户对象，包含要插入的系统用户信息
     * @return 受影响的行数（1表示插入成功，0表示插入失败）
     */
    int insert(SysUser sysUser);

    /**
     * 更新系统用户（根据系统用户ID）
     *
     * @param sysUser 系统用户对象，包含要更新的系统用户信息
     * @return 受影响的行数（1表示更新成功，0表示更新失败）
     */
    int update(SysUser sysUser);

    /**
     * 更新系统用户密码（根据系统用户ID）
     *
     * @param id 系统用户ID
     * @param pwd 新密码
     * @return 受影响的行数（1表示更新成功，0表示更新失败）
     */
    int updatePwd(@Param("id") Integer id, @Param("pwd") String pwd);

    /**
     * 删除系统用户（根据系统用户ID）
     *
     * @param id 系统用户ID
     * @return 受影响的行数（1表示删除成功，0表示删除失败）
     */
    int delete(int id);

    /**
     * 查询所有系统用户
     *
     * @return 所有系统用户列表
     */
    List<SysUser> selectAll();

    /**
     * 根据真实姓名查询系统用户
     *
     * @param realName 真实姓名 （当只有1个参数时，Mapper映射文件中参数名可以任意命名）
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectByRealName(String realName); // Alt + Enter

    /**
     * 根据真实姓名和角色ID查询系统用户
     * 2个或2个以上参数时，必须使用@Param注解为每个参数指定参数名，否则会报错
     *
     * @param realName 真实姓名（模糊匹配）
     * @param roleId 角色ID
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectByRealNameAndRoleId(@Param("realName") String realName, @Param("roleId") Integer roleId);

    /**
     * 根据角色ID数组查询系统用户
     *
     * @param roleIds 角色ID数组
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectByRoleIdArray(Map<String, Object> roleIds);

    /**
     * 根据真实姓名和角色ID查询系统用户
     * 2个或2个以上参数时，必须使用@Param注解为每个参数指定参数名，否则会报错
     * 使用Map参数传递多个参数时，Map的key必须与Mapper映射文件中的参数名一致
     *
     * @param param 包含真实姓名和角色ID的Map参数
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectByMap(Map<String, Object> param);

    /**
     * 根据SysUser对象查询系统用户
     * 使用SysUser中的属性作为查询条件，当属性值为null时，不作为查询条件
     *
     * @param sysUser SysUser对象，包含查询条件
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectByPojo(SysUser sysUser);

    /**
     * 根据SysUser对象分页查询系统用户
     * 使用SysUser中的属性作为查询条件，当属性值为null时，不作为查询条件
     *
     * @param sysUser SysUser对象，包含查询条件
     * @param pageIndex 分页索引（从1开始）
     * @param pageSize 分页大小（每页显示的记录数）
     * @return 符合条件的系统用户列表（分页结果）
     */
    List<SysUser> selectPageByPojo(@Param("sysUser") SysUser sysUser, @Param("pageIndex") Integer pageIndex, @Param("pageSize") Integer pageSize);

    /**
     * 根据表名查询系统用户
     *
     * @param tableName 表名
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectList(String tableName);

    /**
     * 根据真实姓名和角色ID查询系统用户
     * 2个或2个以上参数时，必须使用@Param注解为每个参数指定参数名，否则会报错
     *
     * @param realName 真实姓名（模糊匹配）
     * @param roleId 角色ID
     * @return 符合条件的系统用户列表
     */
    List<SysUser> selectUserJoinRoleNameByRealNameAndRoleId(@Param("realName") String realName, @Param("roleId") int roleId);

    /**
     * 查询所有系统用户，同时查询每个用户的角色信息
     *
     * @param id 用户ID
     * @return 所有系统用户，每个用户包含角色信息
     */
    SysUser selectUserWithSysRole(int id);

    /**
     * 查询所有系统用户，同时查询用户所包含的地址信息列表
     *
     * @param id 用户ID
     * @return 所有系统用户，及用户包含地址信息列表
     */
    SysUser selectUserAndAddressList(int id);

}




